﻿#include<iostream>

using namespace std;

//class Person
//{
//public:
//	string  _name; // 姓名 
//
//};
//
//class Student: virtual public Person
//{
//protected:
//	int _num;//学号
//};
//
//class Teacher:virtual public Person
//{
//protected:
//	int _id; // 职⼯编号 
//
//};
//class Assistant:public Student,public Teacher
//{
//protected:
//	string _majorCourse; // 主修课程 
//};
//int main()
//{
//	Assistant a;
//	a._name = "aaaaa";
//
//
//	return 0;
//}

//class Person
//{
//public:
//	Person(const char* name)
//		:_name(name)
//	{}
//	string _name; // 姓名
//};
//class Student : virtual public Person
//{
//public:
//	Student(const char* name, int num)
//		:Person(name)
//		, _num(num)
//	{}
//protected:
//	int _num; //学号
//};
//class Teacher : virtual public Person
//{
//public:
//	Teacher(const char* name, int id)
//		:Person(name)
//		, _id(id)
//	{}
//protected:
//	int _id; // 职⼯编号
//};
//// 不要去玩菱形继承
//class Assistant : public Student, public Teacher
//{
//public:
//	Assistant(const char* name1, const char* name2, const char* name3)
//		:Person(name3)
//		, Student(name1, 1)
//		, Teacher(name2, 2)
//	{}
//protected:
//	string _majorCourse; // 主修课程
//};
//int main()
//{
//	// 思考⼀下这⾥a对象中_name是"张三", "李四", "王五"中的哪⼀个？
//	Assistant a("张三", "李四", "王五");
//	return 0;
//}

//class A
//{
//};
//class B
//{
//private:
//	A _a;
//};
//
//int main()
//{
//
//
//	return 0;
//}


//class A
//{
//public:
//	virtual void print() { cout << "(>^ω^<)喵" << endl; }
//};
//class B : public A
//{
//public:
//	virtual void print() { cout << "旺旺" << endl; }
//};
//class C :public A
//{
//public:
//	virtual void print() { cout << "56888888567" << endl; }
//};
//void tab(A* x)
//{
//	x->print();
//}
//
//int main()
//{
//	A a;
//	B b;
//	C c;
//	tab(&a);
//	return 0;
//}

//class Person
//{
//public:
//	virtual void BuyTicket() { cout << "买票-全价" << endl; }
//};
//class Student:public Person
//{
//public:
//	virtual void BuyTicket() {  cout << "买票-打折" << endl;; }
//};
//
//void tab(Person* x)
//{
//	// 这⾥可以看到虽然都是Person指针Ptr在调⽤BuyTicket
//    // 但是跟ptr没关系，⽽是由ptr指向的对象决定的。
//	x->BuyTicket();
//
//}
//
////virtual void print()
////{
////
////}
//
//int main()
//{
//
//	Person ps;
//	Student st;
//
//	tab(&ps);
//	tab(&st);
//
//	return 0;
//}



//class Person
//{
//public:
//	virtual void BuyTicket() { cout << "买票-全价" << endl; }
//};
//class Student :public Person
//{
//public:
//	virtual void BuyTicket() { cout << "买票-打折" << endl;; }
//};
//
//void tab(Person* ptr)
//{
//	// 这⾥可以看到虽然都是Person指针ptr在调⽤BuyTicket
//	// 但是跟ptr没关系，⽽是由ptr指向的对象决定的。
//	ptr->BuyTicket();
//
//}
//
//
//int main()
//{
//
//	Person ps;
//	Student st;
//
//	tab(&ps);
//	tab(&st);
//
//	return 0;
//}



//class Animal
//{
//public:
//	virtual void talk() 
//	{}
//};
//
//class Dog:public Animal
//{
//public:
//	virtual void talk(int val) { cout << "汪汪" << endl; }
//};
//
//class Cat :public Animal
//{
//public:
//	virtual void talk(int val) { cout << "(>^ω^<)喵" << endl; }
//};
//


//class A
//{
//public:
//	virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
//	
//};
//
//class B : public A
//{
//public:
//	void func(int val = 0) { std::cout << "B->" << val << std::endl; }
//	virtual void test() { func(); }
//};
//
//void tab(A* ptr)
//{
//	ptr->func();
//}
//int main()
//{
//	B p;
//	tab(&p);
//	return 0;
//}
//


//class A {};
//class B : public A {};
//class Person {
//public:
//	virtual A* BuyTicket()
//	{
//		cout << "买票-全价" << endl;
//		return nullptr;
//	}
//};
//class Student : public Person {
//public:
//	virtual B* BuyTicket()
//	{
//		cout << "买票-打折" << endl;
//		return nullptr;
//	}
//};
//void Func(Person* ptr)
//{
//	ptr->BuyTicket();
//}
//int main()
//{
//	Person ps;
//	Student st;
//
//	Func(&ps);
//	Func(&st);
//
//	return 0;
//}



//class A
//{
//public:
//	 virtual ~A()
//	{
//		cout << "~A()" << endl;
//	}
//};
//class B : public A {
//public:
//	virtual ~B()
//	{
//		cout << "~B()->delete:" << _p << endl;
//		delete _p;
//	}
//protected:
//	int* _p = new int[10];
//};
//// 只有派⽣类Student的析构函数重写了Person的析构函数，下⾯的delete对象调⽤析构函数，才能构成多态，才能保证p1和p2指向的对象正确的调⽤析构函数。
//int main()
//{
//	A* p1 = new A;
//	A* p2 = new B;
//	delete p1;
//	delete p2;
//	return 0;
//}



//class A
//{
//public:
//	 ~A() { cout << "~A" << endl; }
//};
//class B :public A
//{
//public:
//	   ~B() override
//	{ 
//		cout << "~B->" << _p << endl; 
//	}
//protected:
//	int* _p = new int[1000];
//};
//
//int main()
//{
//	A* p1 = new A;
//	A* p2 = new B;
//
//	delete p1;
//	delete p2;
//
//	return 0;
//}


